//==================================================
//Instituto Tecnologico de Costa Rica
//Principios de Sistemas Operativos 
//Profesora: Ericka Marin 
//Tarea Programada 1
//Integrantes:
//Roland Chaverri
//Gabriel Rodriguez Brenes
//==================================================
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include <sys/stat.h>
#include "administrador.h"
#include "mode_THREAD.c"
#define MODE_FIFO 1
#define MODE_FORK 2
#define MODE_THREAD 3


/*
 * Principal del program admin
 * @param argc: cantidad de parametros en  la consola
 * @param argv: arreglo que contiene los parametros ingresados
 *              en la consola
 */
void getComando(int argc, char** argv)
{
    if(!esNumero(argv[1]))
    {
        perror("Debe digitar un numero en el modo");
    }
    else
    {
        int modo = atoi(argv[1]);
        char *url = argv[2];
        char *carpeta = argv[3];

        switch(argc)
        {
            case 4:
                determina_modo(modo, url, carpeta);
                break;

            default:
                muestraAyuda();
                break;
        }
    }
}
/**
 * Determina el modo de descarga
 * @param modo: 1:FIFO 2:FORK 3:THREAD
 * @param url: pagina a descargar
 * @param carpeta: carpeta contendiendo las paginas
 */
void determina_modo(int modo, char *url, char *carpeta)
{
    switch(modo)
    {
        case MODE_FIFO:
            crear_carpeta(carpeta);
            descargar_FIFO(url);
            break;
            
        case MODE_FORK:
            crear_carpeta(carpeta);
            descargar_FORK(url);
            break;
            
        case MODE_THREAD:
            crear_carpeta(carpeta);
            descargar_THREAD(url);
            break;
            
        default:
            muestraAyuda();
            break;
    }
}
/**
 * Metodo que baja la direccion web 
 * @param buffer
 * @return 
 */
void descargar_FIFO(char *url)
{
    printf("Descargando modo FIFO...\n");
    //Bajar con Hilos
    
}
/**
 * Metodo que baja la direccion web 
 * @param buffer
 * @return 
 */
void descargar_FORK(char *url)
{
    printf("Descargando modo FORK...\n");
    //Bajar con Hilos
   
}
/**
 * Metodo que baja la direccion web 
 * @param buffer
 * @return 
 */
void descargar_THREAD(char *url)
{
    printf("Descargando modo THREAD...\n");
    //Bajar con Hilos
    
}

/**
 * Crea la carpeta donde se descargaran
 * las paginas
 * @param carpeta nombre de la carpeta
 */
void crear_carpeta(char *carpeta)
{
    int result;
    mode_t process_mask = umask(0);
    if (result = mkdir(carpeta, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) != 0){
        printf("Carpeta no fue creada %i", result);
    }
    umask(process_mask);
}

/**
 * Comprueba si una cadena corresponde a
 * un numero
 */
int esNumero(char *buffer)
{
    int numero;
    char *no_es_entero;
    numero = strtol(buffer, &no_es_entero, 10 );

    if (*no_es_entero != '\0') {
        return 0;
    }
    else{
        return 1;
    }
}

/**
 * Muestra la ayuda y la explicacion de los comandos
 */
void muestraAyuda()
{
    printf("Ayuda\n");
    printf("Uso: bajar <modo> <direccion> <ubicacion> \n");
    printf("Indicaciones: \n");
    printf("\tmodo: numero del tipo de descarga(1:FIFO 2:FORK 3:THREAD) \n");
    printf("\tdireccion: URL a descargar\n");
    printf("\tubicacion: carpeta donde se descarga el sitio\n");
}
